package me.alex.learnkotlin.learnKT6

/**
 * 学习 标准函数和静态方法
 */
fun main() {
    //1.1 标准函数with
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    val builder = StringBuilder()
    builder.append("开始吃水果 \n")
    for (fruit in list) {
        builder.append(fruit).append("\n")
    }
    builder.append("吃完了")
    val result = builder.toString()
    println(result)
    //因为多次调用builder对象的方法 这里用with函数简化
    val result1 = with(StringBuilder()) {
        append("开始with吃水果 \n")
        for (fruit in list) {
            //这里this指代StringBuilder的实例对象 (Lambda中的上下文都指代StringBuilder对象)
            this.append(fruit).append("\n")
        }
        //也可以不用this.
        append("吃完了 \n")
        toString()
    }
    print(result1)

    //1.2 标准函数run
    //和with函数类似
    val result2 = StringBuilder().run {
        append("开始run吃水果 \n")
        for (fruit in list) {
            //这里this指代StringBuilder的实例对象 (Lambda中的上下文都指代StringBuilder对象)
            this.append(fruit).append("\n")
        }
        //也可以不用this.
        append("吃完了 \n")
        toString()
    }
    print(result2)

    //1.3 标准函数apply
    //apply函数返回的是StringBuilder对象本身,本来不能运行toString()方法.但是可能因为StringBuilder类的自身方法这里调用也正常运行 后续再做验证
    val result3 = StringBuilder().apply {
        append("开始apply吃水果 \n")
        for (fruit in list) {
            //这里this指代StringBuilder的实例对象 (Lambda中的上下文都指代StringBuilder对象)
            this.append(fruit).append("\n")
        }
        //也可以不用this.
        append("吃完了 \n")
//        toString()
    }
    println(result3.toString())

    //2.1 静态方法
    val staticDemo = StaticDemo()
    staticDemo.static1()
    //这里使用companion关键字和object关键字修饰静态方法 创造一个伴生类 可以直接调用静态方法
    StaticDemo.static2()

    //2.2 顶层方法
    //顶层方法可以直接调用不需要类名.函数名
    doSomething()
    //Java中需要使用TopMethod.doSomething()调用
}